import re
from rest_framework import serializers
from django.contrib.auth.models import Permission, Group
from django.contrib.contenttypes.models import ContentType
# 定制权限信息查看的序列化类
from users.models import User


class PermissionSerializer(serializers.ModelSerializer):
    # 直接从数据库里获取我们想要的数据字段
    class Meta:
        model = Permission
        fields = '__all__'  # 获取默认所有的字段

# 定期权限创建中需要的权限类型查看的 序列化类
class ContentTypeSerializer(serializers.ModelSerializer):
    # 直接从数据库里获取我们想要的数据字段
    class Meta:
        model = ContentType
        fields = ('id', 'name')

# 定制权限信息查看的序列化类
class GroupSerializer(serializers.ModelSerializer):
    # 直接从数据库里获取我们想要的数据字段
    class Meta:
        model = Group
        fields = '__all__'  # 获取默认所有的字段

# 定制权限信息查看的序列化类
class PermissionSimpleSerializer(serializers.ModelSerializer):
    # 直接从数据库里获取我们想要的数据字段
    class Meta:
        model = Permission
        fields = ('id', 'name')


# 定制管理员信息查看的序列化类
class AdminSerializer(serializers.ModelSerializer):
    # 直接从数据库里获取我们想要的数据字段
    class Meta:
        model = User
        # 通用的序列化字段
        fields = ('id', 'username', 'email', 'mobile', 'groups', 'user_permissions')
        # 定制的密码字段
        extra_kwargs = {
            "password": {
                "required": False,
                "write_only": True,
                "allow_blank": True
            }
        }
    # 对手机号进行二次校验
    def validated_mobile(self, value):
        if not re.match(r'^1[3-9]\d{9}$',value):
            raise Exception("手机号格式不正确")

    # 重写create方法，1 将用户保存为管理员用户、2 对密码进行加密
    def create(self, validated_data):
        # 1 将用户保存为管理员用户
        validated_data['is_staff'] = True
        # 2 将默认的数据进行保存
        user = super().create(validated_data)
        # 3 对密码进行加密
        password = validated_data.get('password')
        if not password:
            password = '123456abc'

        user.set_password(password)
        user.save()
        return user

    # 重写update方法：-- 将我们的密码在保存到 时候，进行加密
    def update(self, instance, validated_data):
        # 1 获取我们的密码
        password = validated_data.pop('password', None)
        # 2 普通信息的保存
        super().update(instance, validated_data)
        # 3 密码加密更改
        if password:
            instance.set_password(password)
            instance.save()
        return instance

# 定制权限信息查看的序列化类
class GroupSimpleSerializer(serializers.ModelSerializer):
    # 直接从数据库里获取我们想要的数据字段
    class Meta:
        model = Group
        fields = ('id', 'name')
